﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//int main()
//{
//	printf("%d\n", 153);
//	printf("%d\n", 0153);//8进制
//	return 0;
//}

//int main()//数据存放内存中其实存放的是补码
//{
//	int a = 1 - 1;//1+(-1)
//	//0000000000000000000000000000001    1的原码
//	//1000000000000000000000000000001    -1的原码
//	//相加为-2
//	//使用补码就正确
//	//0000000000000000000000000000001    1的补码
//	//1111111111111111111111111111111     -1的补码
//	//相加为0000000000000000000000000000000（33位）    多余1位不要，结果为0
//	return 0;
//}

//int main() //左移操作符 <<:左边抛弃、右边补0(移位操作符的操作数只能是整数)
//{
//	int a = 10;
//	int b=a << 1;//左移1位(移位的是补码)
//	//00000000000000000000000000001010     1010--》10
//	// 00000000000000000000000000010100    10100--》20
//	printf("%d\n", b);//左移1位相当于数值×2（整数）
//	printf("%d", a);
//	return 0;
//}

//int main()//右移操作符>>:移位规则：右移运算分两种：1. 逻辑右移：左边⽤0填充，右边丢弃，2. 算术右移：左边⽤原该值的符号位填充，右边丢弃
//{//(移位的是补码)
//	int a = 10;
//	int b=a >> 1;
//	printf("%d\n", b);//右移1位相当于数值÷2（整数）
//	printf("%d", a);
//	return 0;
//}

//int main()//位操作符
//{
//	//& 按位与（逻辑与&&），| 按位或（||），^ 按位异或，~ 按位取反
//	int a = 4;
//	int b = -7;
//	int c = a & b;
//	int d = a | b;
//	int e = a ^ b;
//	int f = ~ b;
//	//使用补码进行按位与，或，异或，反
//	//00000000000000000000000000000100   4（补码）
//	                                                //10000000000000000000000000000111   -7（原码）
//	//11111111111111111111111111111001   -7（补码）
//	
//	//00000000000000000000000000000000     （补码）     &：有0就是0，两个同时为1则为1
//	
//	//11111111111111111111111111111101      （补码）    | :有1就是1，两个同时为0则为0
//	
//	//11111111111111111111111111111101       （补码）   ^ :相同为0，相异为1
//
//	//00000000000000000000000000000110       （补码）   ~:1为0，0为1
//	printf("%d\n", c);//打印原码            补码取反  +1             
//	printf("%d\n", d);//打印原码              补码取反  +1
//	printf("%d\n", e);//打印原码            补码取反  +1  
//	printf("%d\n", f);//打印原码            补码取反  +1  
//	return 0;
//}


//异或运算特殊场景：a^a=0;a^0=a
//int main()//变态面试题(完成两个数交换，不能创建临时变量（第三个变量）)
//{
//	int a = 10;
//	int b = 20;
//	a = a ^ b;
//	b = a ^ b;//b = a ^ b ^ b;
//	a = a ^ b;//a = a ^ b ^ a;
//	printf("a = %d b = %d\n", a, b);
//	return 0;
//}

//int count_one_of_bit(unsigned int m)//⼀个整数存储在内存中的⼆进制中1的个数
//{
//	int count = 0;
//	/*while (m!=0)
//	{
//		if (m % 2 == 1)
//			count++;
//		m = m / 2;
//	}*/
////	/*for (int i = 0; i < 32; i++)
////	{
////		if (((m >> i) & 1) == 1)
////			count++;
////	}*/
// while(m!=0)
// {
// count++
// n=n&(n-1);
// }
//	return count;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int ret = count_one_of_bit(n);
//	printf("%d\n", ret);
//	return 0;
//}


//⼆进制位 置0或者置1
int main()
{
	int n = 13;
	n = n | (1 << (5 - 1));

	n = n & (~(1 << 4));
	printf("%d\n", n);
	return 0;
}